﻿/*-----------------------------------------------------------------------
 * <copyright file="App.xaml.cs" company="O-RID">
 *     Copyright (c)2010 O-RID Co.,Ltd.
 * </copyright>
 * <author>Zhang jun</author>
 * <summary>
 *             AppPage
 *          作成日：05/21/2010
 *                  07/05/2010 增加 imageUriList 记录 登录提示图标的URI
 * </summary>
 *----------------------------------------------------------------------- 
 */

namespace Orid.Management.Statistics.OperatorUnitMangement
{
    using System;
    using System.Collections.Generic;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Controls.Theming;
    using System.Globalization;
    using System.Threading;
    using Orid.Management.Statistics.OperatorUnitMangement.Common.FunctionList;
    using System.Windows.Media;


    /// <summary>
    /// App Page 
    /// Application
    /// </summary>
    public partial class App : Application
    {  
        #region  设置WCF 地址 
        ////按URI连接WCF，头地址
        ////http://192.168.161.177/WCFService/ Log4Service/WCFLog4.svc
        ////public string strURI = @"http://192.168.161.177/WCFService/";
        #endregion  
       
        /// <summary>
        /// 主题资源列表
        /// ThemeURIList
        /// </summary>
        public List<string> themeURIList = new List<string>();

        /// <summary>
        /// root Grid 
        /// type of guid
        /// </summary>
        private Grid rootGrid = null;

        //07/05/2010 -- add
        /// <summary>
        /// 消息提示框的提示图片的URI
        /// 【0】消息提示用图标
        /// 【1】错误提示用图标
        /// </summary>
        public List<string> imageUriList = new List<string>();

        /// <summary>
        /// Gets a value of themeURI
        /// </summary>
        public string ThemeURI
        {
            get
            {
                //return "Resources/Theme/GlowTheme.xaml";
                return "";
            }
          
        }

        /// <summary>
        /// Gets  a value of logStr
        /// </summary>
        public string LogStr
        {
            get
            {
                if (ClientUserInfor.UserRealName != null)
                {
                    return FunctionClass.GetFormatedVersion(false) + " - 用户 " + ClientUserInfor.UserRealName;
                }
                else
                {
                    return FunctionClass.GetFormatedVersion(false) + " - ";
                }
            }
        }

        private static ScrollViewer root;

        /// <summary>
        /// 构造函数
        ///   App
        /// </summary>
        public App()
        {
            this.Startup += this.Application_Startup;
            this.Exit += this.Application_Exit;
            this.UnhandledException += this.Application_UnhandledException;

            InitializeComponent();

            rootGrid = new Grid();

            //当前所有主题(动态设置主题用)
            this.themeURIList.Add("Resources/Theme/WhistlerBlue.xaml");
            
            //提示用图标
            this.imageUriList.Add("../../Resources/Image/Log_Infor.png"); //消息提示用图标
            this.imageUriList.Add("../../Resources/Image/Log_Error.png"); //错误提示用图标

        }

        /// <summary>
        /// 页面跳转
        /// RedirectTo
        /// </summary>
        /// <param name="usercontrol">UserControl usercontrol</param>
        public void RedirectTo(UserControl usercontrol)
        {
            // 它的意思就是得到当应用程序的对象;
            App app = (App)Application.Current;

            // ②刚才是对Grid里面添加Login页面进去了,现在为了添加成功页面进去,必须把Grid控件中的Login清除掉;
            app.rootGrid.Children.Clear();

            // 这上操作是建立在②的基础之上的,没有它的Clear就不能添加;所以这一步就是在添加新页面;
            app.rootGrid.Children.Add(usercontrol);


        }       
   
        /// <summary>
        /// 页面清除
        /// RedirectClear
        /// </summary>
        /// <param name="usercontrol">UserControl usercontrol</param>
        public void RedirectClear(UserControl usercontrol)
        {
            // 它的意思就是得到当应用程序的对象;
            App app = (App)Application.Current;

            app.rootGrid.Children.Clear();
        }

        /// <summary>
        /// 设置主题
        /// Set Theme
        /// </summary>
        /// <param name="controlname">主题应用的控件 FrameworkElement</param>
        public void SetTheme(FrameworkElement controlname)
        {
            #region
            ////ImplicitStyleManager组件
            ////组件所在命名空间：
            ////System.Windows.Controls.Theming

            ////组件常用方法：
            ////Apply：应用隐式样式至一个元素及其依赖元素。
            ////GetApplyMode：获取由一个指定框架元素附加属性的ImplicitStyleManager.ApplyMode的值。该值表明样式是否能被隐式地应用于依赖框架元素之上。
            ////GetResourceDictionaryUri：获取由一个指定框架元素附加属性的ImplicitStyleManager.ResourceDictionaryUri的值。该值表明资源词典的URI地址被隐式应用了。
            ////SetApplyMode：设置由一个指定框架元素附加属性的ImplicitStyleManager.ApplyMode的值。该值表明样式是否能被隐式地应用于依赖框架元素之上。
            ////SetResourceDictionaryUri：设置由一个指定框架元素附加属性的ImplicitStyleManager.ResourceDictionaryUri的值。该值表明资源词典的URI地址被隐式应用了。

            ////组件常用属性：
            ////ApplicationResourceDictionaryUri：获取或设置在应用程序中被隐式地应用于所有框架元素的ResourceDictionary URI。
            ////UseApplicationResources：获取或设置一个值来表示隐式应用的样式是否基于来自ImplicitStyleManager.ApplicationResourceDictionaryUri的值。
            #endregion

            try
            {
                Uri uri = new Uri(this.ThemeURI.Trim(), UriKind.RelativeOrAbsolute);
                ImplicitStyleManager.SetResourceDictionaryUri(controlname, uri);
                ImplicitStyleManager.SetApplyMode(controlname, ImplicitStylesApplyMode.Auto );
                ImplicitStyleManager.Apply(controlname as FrameworkElement);
            }
            catch 
            {
                return;
            }
           
        }

        /// <summary>
        /// 更换主题
        /// SetSelTheme
        /// </summary> 
        /// <param name="controlname">FrameworkElement controlname</param>
        /// <param name="themeURI1">string themeURI1</param>
        public void SetSelTheme(FrameworkElement controlname, string themeURI1)
        {
            #region
            ////ImplicitStyleManager组件
            ////组件所在命名空间：
            ////System.Windows.Controls.Theming

            ////组件常用方法：
            ////Apply：应用隐式样式至一个元素及其依赖元素。
            ////GetApplyMode：获取由一个指定框架元素附加属性的ImplicitStyleManager.ApplyMode的值。该值表明样式是否能被隐式地应用于依赖框架元素之上。
            ////GetResourceDictionaryUri：获取由一个指定框架元素附加属性的ImplicitStyleManager.ResourceDictionaryUri的值。该值表明资源词典的URI地址被隐式应用了。
            ////SetApplyMode：设置由一个指定框架元素附加属性的ImplicitStyleManager.ApplyMode的值。该值表明样式是否能被隐式地应用于依赖框架元素之上。
            ////SetResourceDictionaryUri：设置由一个指定框架元素附加属性的ImplicitStyleManager.ResourceDictionaryUri的值。该值表明资源词典的URI地址被隐式应用了。

            ////组件常用属性：
            ////ApplicationResourceDictionaryUri：获取或设置在应用程序中被隐式地应用于所有框架元素的ResourceDictionary URI。
            ////UseApplicationResources：获取或设置一个值来表示隐式应用的样式是否基于来自ImplicitStyleManager.ApplicationResourceDictionaryUri的值。
            #endregion

            Uri uri = new Uri(themeURI1.Trim(), UriKind.RelativeOrAbsolute);
            ImplicitStyleManager.SetResourceDictionaryUri(controlname, uri);
            ImplicitStyleManager.SetApplyMode(controlname, ImplicitStylesApplyMode.Auto);
            ImplicitStyleManager.Apply(controlname);
        }

        /// <summary>
        /// 应用程序启动事件
        /// Application_Startup
        /// </summary>
        /// <param name="sender">sender of object</param>
        /// <param name="e">e type of StartupEventArgs</param>
        private void Application_Startup(object sender, StartupEventArgs e)
        {
            //this.RootVisual = new TheOthersRelated.ParentIDQuery.ParentIDContainter();

           
            ////指定初始化时，加载的语言
            ////CultureInfo culture = new CultureInfo("ja-JP");
            ////Thread.CurrentThread.CurrentCulture = culture;
            ////Thread.CurrentThread.CurrentUICulture = culture;

         
            // Grid控件加载完成了,那么它的创建也完成,接下我们就可以为它添加一个子页面;
            MainPageControl.UserLog_Win ulw = new MainPageControl.UserLog_Win();
            // ulw.HasCloseButton = false;
            this.rootGrid.Children.Clear();
            this.rootGrid.Children.Add(ulw);
           

            // 当整个应用程序启动时,程序的主界面加载就是Grid;
            this.RootVisual = this.rootGrid;
           
        }

        /// <summary>
        /// 应用程序退出事件
        /// Application_Exit
        /// </summary>
        /// <param name="sender">sender of object</param>
        /// <param name="e">e type of EventArgs</param>
        private void Application_Exit(object sender, EventArgs e)
        {

        }

        /// <summary>
        /// 应用程序异常
        /// Application_UnhandledException
        /// </summary>
        /// <param name="sender">sender of object</param>
        /// <param name="e">e type of ApplicationUnhandledExceptionEventArgs</param>
        private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
        {
            // 如果应用程序是在调试器外运行的，则使用浏览器的
            // 异常机制报告该异常。在 IE 上，将在状态栏中用一个 
            // 黄色警报图标来显示该异常，而 Firefox 则会显示一个脚本错误。
            if (!System.Diagnostics.Debugger.IsAttached)
            {
                // 注意: 这使应用程序可以在已引发异常但尚未处理该异常的情况下
                // 继续运行。 
                // 对于生产应用程序，此错误处理应替换为向网站报告错误
                // 并停止应用程序。
                e.Handled = true;
                Deployment.Current.Dispatcher.BeginInvoke(delegate { this.ReportErrorToDOM(e); });
            }
        }

        /// <summary>
        /// ReportError ToDOM
        /// </summary>
        /// <param name="e">e type of ApplicationUnhandledExceptionEventArgs</param>
        private void ReportErrorToDOM(ApplicationUnhandledExceptionEventArgs e)
        {
            try
            {
                string errorMsg = e.ExceptionObject.Message + e.ExceptionObject.StackTrace;
                errorMsg = errorMsg.Replace('"', '\'').Replace("\r\n", @"\n");

                System.Windows.Browser.HtmlPage.Window.Eval("throw new Error(\"Unhandled Error in Silverlight Application " + errorMsg + "\");");
            }
            catch (Exception)
            {
            }
        }

        /// <summary>
        /// 页面关闭
        /// Ulw_Closed
        /// </summary>
        /// <param name="sender">sender of object</param>
        /// <param name="e">e type of EventArgs</param>
        private void Ulw_Closed(object sender, EventArgs e)
        {
            this.Exit += new EventHandler(this.Application_Exit);
        } 
    }
}
